home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NOVA - For the NeXT Workstation
/
NOVA - For the NeXT Workstation.iso
/
SourceCode
/
AdobeExamples
/
NX_ImportAdv
/
GraphicList.m
< prev
next >
Wrap
Text File
|
1992-12-19
|
6KB
|
280 lines
/*
* (a) (C) 1990 by Adobe Systems Incorporated. All rights reserved.
*
* (b) If this Sample Code is distributed as part of the Display PostScript
* System Software Development Kit from Adobe Systems Incorporated,
* then this copy is designated as Development Software and its use is
* subject to the terms of the License Agreement attached to such Kit.
*
* (c) If this Sample Code is distributed independently, then the following
* terms apply:
*
* (d) This file may be freely copied and redistributed as long as:
* 1) Parts (a), (d), (e) and (f) continue to be included in the file,
* 2) If the file has been modified in any way, a notice of such
* modification is conspicuously indicated.
*
* (e) PostScript, Display PostScript, and Adobe are registered trademarks of
* Adobe Systems Incorporated.
*
* (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
* CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
* AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
* ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
* OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
* WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
* WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
* DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
* OF THIRD PARTY RIGHTS.
*/
/*
* GraphicList.m
*
* This class is used to simplify the messaging of the graphics.
* Eliminates the need to walk the list in DrawingView.
*
* Version: 2.0
* Author: Ken Fromm
*/
#import "GraphicList.h"
#import "GraphicImport.h"
#import "DrawingView.h"
#import <appkit/nextstd.h>
#import <dpsclient/wraps.h>
@implementation GraphicList
- copy
{
id copyId;
int i;
copyId = [GraphicList newCount:numElements];
for (i = 0; i < numElements; i++)
[copyId insertObject:[self objectAt:i] at:i];
return copyId;
}
- copyTemp
{
id copyId;
int i;
copyId = [GraphicList newCount:numElements];
for (i = 0; i < numElements; i++)
[copyId insertObject:[[self objectAt:i] copyTemp] at:i];
return copyId;
}
- freeTemp
{
int i;
for (i = 0; i < numElements; i++)
[[self objectAt:i] freeTemp];
return self;
}
- replaceObjectsIn:aList with:bList
{
int i, j;
j = [aList count];
for (i = 0; i < j; i++)
{
if (![self replaceObject:[aList objectAt:i] with:[bList objectAt:i]])
[self insertObject:[bList objectAt:i] at:0];
}
return self;
}
- removeObjectsIn:bList
{
int i, j;
j = [bList count];
for (i = 0; i < j; i++)
[self removeObject:[bList objectAt:i]];
return self;
}
- insertObjectsIn:bList
{
int i, j;
j = [bList count];
for (i = j-1; i >= 0; i--)
[self insertObject:[bList objectAt:i] at:0];
return self;
}
/* Set all the objects in the list to either selected or not. */
- setSelected:(BOOL) flag
{
int i;
for (i = numElements - 1; i >= 0; i--)
[[self objectAt:i] setSelected:flag];
return self;
}
/* Reflect the rotation in all the objects of the list. */
- rotateAboutPoint:(NXPoint *) aPoint withAngle:(float) angle
{
int i;
for (i = numElements - 1; i >= 0; i--)
[[self objectAt:i] rotateAboutPoint:aPoint withAngle:angle];
return self;
}
/* Reflect the change in all the objects of the list. */
- moveAll:(const NXPoint *) pt
{
int i;
for (i = numElements - 1; i >= 0; i--)
[[self objectAt:i] moveAll:pt];
return self;
}
/*
* Returns the bounds. The flag variable determines whether the
* knobs should be factored in. They may need to be for drawing but
* might not if needed for constraining reasons.
*/
- getBounds:(NXRect *)aRect
{
int i;
NXRect bRect;
for (i = numElements - 1; i >= 0; i--)
{
[[self objectAt:i] getBounds:&bRect];
if (i == numElements - 1)
*aRect = bRect;
else
NXUnionRect(&bRect, aRect);
}
return self;
}
/*
* Return the rectangle that should be used for scrolling purposes.
* When the rectangle passes out of the visible rectangle then
* the screen should scroll.
*/
- getScrollRect:(NXRect *)aRect forPtNum:(int) pt_num
{
return [self getBounds:aRect];
}
- constrainAngle:(float *) angle withFlags:(int)flags
{
[[self objectAt:0] constrainAngle:angle withFlags:flags];
return self;
}
/*
* Check for a control point hit on all the objects in the list. If yes then return
* the hit object.
*/
- hitControl:(const NXRect *) hitRect :(int *) pt_num forSize:(float) size
{
id objectId;
int i;
for (i = 0; i < numElements; i++)
if (objectId = [[self objectAt:i] hitControl:hitRect :pt_num forSize:(float) size])
return objectId;
return nil;
}
/*
* Place the point locations and the chararacters for the control
* points of the objects in the list into the user path description.
*/
- putControlPoints:(UPath *)buffer forRect:(NXRect *)r :(NXPoint *) lastPoint
{
int i;
for (i = numElements - 1; i >= 0; i--)
[[self objectAt:i] putControlPoints:buffer forRect:r :lastPoint];
return self;
}
/*
* Draws the graphic.
*/
- drawObject:(NXRect *) r withFlags:(int) flags inView:view
{
id graphic;
int i;
for (i = numElements - 1; i >= 0; i--)
{
graphic = [self objectAt:i];
[graphic drawObject:r withFlags:flags inView:view];
if (NXDrawingStatus == NX_DRAWING &&
flags & REFRESHFLAG &&
[graphic isKindOf:[GraphicImport class]])
{
/*
* Relies on the assumption that the buffer is the currently
* focused view. This refreshes the screen with each EPSF file.
* If not then it could take a while to have some visual results
* when imaging several files in a row.
*/
[[view buffer] unlockFocus];
PScomposite(NX_X(r), NX_Y(r), NX_WIDTH(r), NX_HEIGHT(r),
[[view buffer] gState], r->origin.x, r->origin.y, NX_COPY);
[[view buffer] lockFocus];
}
}
return self;
}
- addResources:(Resource *) resourceDoc for:(NXRect *) r
{
id graphic;
int i;
for (i = numElements - 1; i >= 0; i--)
{
graphic = [self objectAt:i];
if ([graphic isKindOf:[GraphicImport class]])
[graphic addResources:resourceDoc for:r];
}
return self;
}
@end